import axios from 'axios';
import storage from './storageType';
import AsyncStorage from '@react-native-async-storage/async-storage';

const API_URL = 'http://43.136.83.171:8000/api/v1'; // 您的API基础URL 

const apiClient = axios.create({
    baseURL: API_URL,
    headers: {
        'Content-Type': 'application/json',
    },
});

// 请求拦截器
apiClient.interceptors.request.use(
    async (config) => {
        // 从 localStorage 获取 access_token 
        const token = await storage.getItem('access_token');
        // console.log('Access Token:', token); // 添加调试日志
        if (token) {
            // 如果存在，添加到 Authorization 头，认证方式为 JWT Bearer 
            config.headers.Authorization = `Bearer ${token}`;
        }
        return config;
    },
    (error) => {
        return Promise.reject(error);
    }
);

// 响应拦截器
apiClient.interceptors.response.use(
    (response) => {
        return response;
    },
    async (error) => {
        const originalRequest = error.config;

        // 如果是 401 Unauthorized 错误  且尚未重试
        if (error.response && error.response.status === 401 && !originalRequest._retry) {
            originalRequest._retry = true; // 标记请求已重试过

            // 从 localStorage 获取 refresh_token
            const refreshToken = await storage.getItem('refresh_token');

            if (refreshToken) {
                try {
                    // 使用一个不带拦截器的新 Axios 实例或直接使用 axios 默认实例来发送刷新令牌请求
                    // 避免在此处使用 apiClient，因为它会再次触发拦截器，可能导致死循环
                    const refreshResponse = await axios.post(`${API_URL}/auth/refresh`, { // 刷新登录许可的路径 
                        refresh: refreshToken,
                    }, {
                        headers: {
                            'Content-Type': 'application/json',
                        }
                    });

                    const { access, refresh } = refreshResponse.data.data; // 根据API文档，access和refresh在data对象中 

                    // 更新 localStorage 中的令牌
                    storage.setItem('access_token', access);
                    storage.setItem('refresh_token', refresh);

                    // 更新 apiClient 的默认 Authorization 头，以便后续请求使用新令牌
                    apiClient.defaults.headers.common['Authorization'] = `Bearer ${access}`;

                    // 使用新的 access token 重新发送原始请求
                    return apiClient(originalRequest);
                } catch (refreshError: any) {
                    console.error('Refresh token failed:', refreshError.response?.data || refreshError.message);
                    // 刷新令牌也失败，清除所有令牌并强制用户重新登录
                    storage.removeItem('access_token');
                    storage.removeItem('refresh_token');
                    // 可以在此处添加重定向到登录页面的逻辑
                    // 例如：window.location.href = '/login';
                    return Promise.reject(refreshError);
                }
            } else {
                // 没有 refresh token，直接返回 401 错误
                console.error('Unauthorized: No refresh token available.');
                return Promise.reject(error);
            }
        }

        // 处理其他错误码或非 401 错误
        console.error('API Error:', error.response?.status, error.response?.data?.error?.message || error.message); 
        return Promise.reject(error);
    }
);

export default apiClient;